package plutuscat.shishicai.common;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Set;
import java.util.TreeSet;

import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import plutuscat.shishicai.domain.Lottery;

/**
* 从新浪抓取的彩票数据
* @author dw_chenqi
* @date 2016年5月6日上午10:36:42
*/
@Component
public class SinaLotteryDataProvider implements NowadayLotteryDataProvider {

	private static final Logger log = LoggerFactory.getLogger(SinaLotteryDataProvider.class);

	@Override
	public Set<Lottery> provideDataWithLotteryTimeAsc(String date) {
		long startTime = System.currentTimeMillis();
		String httpResponse = crawlLotteryDataWithDate(date);

		String tableHtml = buildTableHtml(httpResponse);

		Set<Lottery> lotterySet = parseHtml(tableHtml);

		long endTime = System.currentTimeMillis();
		log.info("从新浪抓取{}天总共{}条开彩数据!,花费{} ms!", new Object[] { date, lotterySet.size(), (endTime - startTime) });
		return lotterySet;
	}

	/**
	 * 解析html
	 * @param tableHtml
	 * @return
	 */
	private Set<Lottery> parseHtml(String tableHtml) {
		Document doc = Jsoup.parseBodyFragment(tableHtml);
		Elements elements = doc.getElementsByTag("tr");
		Set<Lottery> set = new TreeSet<Lottery>(new Lottery.LotteryComparator());
		for (Element element : elements) {
			Lottery lottery = new Lottery.Builder() //
					.lotteryTime(bulidLotteryTime(element.child(0).text())) //
					.winNumbers(extractWinNumbers(element.child(2).text()))//
					.build();
			set.add(lottery);
		}
		return set;
	}
	
	private String buildTableHtml(String httpResponse) {
		String resultHtml = getResultHtml(httpResponse);
		return new StringBuilder("<table>").append(resultHtml).append("</table>").toString();
	}

	private String getResultHtml(String httpResponse) {
		JSONObject jo = JSON.parseObject(httpResponse);
		return jo.getString("resultHtml");
	}

	private String crawlLotteryDataWithDate(String date) {
		ByteArrayOutputStream baos = null;
		InputStream in = null;
		try {
			String url = "http://sina.aicai.com/kaijiang/open/kcResultByDate.do";
			HttpPost httpPost = new HttpPost(url);
			//gameIndex:301 新浪时时彩的标识 ,searchDate:日期参数
			StringEntity entity = new StringEntity("gameIndex=301&searchDate=" + date);
			httpPost.setEntity(entity);

			httpPost.addHeader("Cookie",
					"JSESSIONID=50862384DA5C31414270284873D02DCE.c75; AUM=dg6fdSgfX1Gf6602kGvMpqs3jN5nt-yqlWtWpTno5j7lw; VUID=07946D833CA140D7B2436671DAE56832; __utma=1.2034815691.1462500877.1462500877.1462500877.1; __utmz=1.1462500877.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); route=f692fe692372ddc44c563438b85f15ba; routekjgg=ef7f2d579df2968f3a2fe27fc2ea61d2; JSESSIONID=F7E1395FEFB58C8FB889EA4D952D6B7B.c36; CNZZDATA2028824=cnzz_eid%3D1731885385-1462498746-http%253A%252F%252Fsports.sina.com.cn%252F%26ntime%3D1462518414; NAGENTID=46965");
			httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");
			httpPost.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36");

			CloseableHttpResponse response = HttpClients.createDefault().execute(httpPost);
			if (response.getEntity() == null) {
				return StringUtils.EMPTY;
			}

			in = response.getEntity().getContent();
			baos = new ByteArrayOutputStream();
			IOUtils.copy(in, baos);

			return new String(baos.toByteArray());
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			IOUtils.closeQuietly(baos);
			IOUtils.closeQuietly(in);
		}
	}

	private String extractWinNumbers(String text) {
		return text.replace("|", "");//新浪返回的原始数据格式:9|6|5|6|8
	}

	private String bulidLotteryTime(String text) {
		return text.substring(0, text.length() - 1);//新浪返回的数据格式:20160504-006期
	}

	public static void main(String[] html1) {
		/*	String html = "<table><tr><td>20160504-119期</td><td class='tdright'>2016-05-04 23:56</td><td style='color:red'>6|9|3|1|3</td><tr class='bg'><td>20160504-118期</td><td class='tdright'>2016-05-04 23:51</td><td style='color:red'>8|9|7|3|6</td><tr><td>20160504-117期</td><td class='tdright'>2016-05-04 23:46</td><td style='color:red'>0|9|4|6|2</td><tr class='bg'><td>20160504-116期</td><td class='tdright'>2016-05-04 23:41</td><td style='color:red'>6|8|4|0|5</td><tr><td>20160504-115期</td><td class='tdright'>2016-05-04 23:36</td><td style='color:red'>2|6|8|1|1</td><tr class='bg'><td>20160504-114期</td><td class='tdright'>2016-05-04 23:31</td><td style='color:red'>6|0|5|9|3</td><tr><td>20160504-113期</td><td class='tdright'>2016-05-04 23:26</td><td style='color:red'>7|9|0|3|2</td><tr class='bg'><td>20160504-112期</td><td class='tdright'>2016-05-04 23:21</td><td style='color:red'>5|2|4|4|7</td><tr><td>20160504-111期</td><td class='tdright'>2016-05-04 23:16</td><td style='color:red'>7|1|9|3|4</td><tr class='bg'><td>20160504-110期</td><td class='tdright'>2016-05-04 23:11</td><td style='color:red'>5|9|5|9|2</td><tr><td>20160504-109期</td><td class='tdright'>2016-05-04 23:06</td><td style='color:red'>7|1|0|8|9</td><tr class='bg'><td>20160504-108期</td><td class='tdright'>2016-05-04 23:01</td><td style='color:red'>1|3|3|3|6</td><tr><td>20160504-107期</td><td class='tdright'>2016-05-04 22:56</td><td style='color:red'>8|3|5|4|7</td><tr class='bg'><td>20160504-106期</td><td class='tdright'>2016-05-04 22:51</td><td style='color:red'>8|6|6|7|9</td><tr><td>20160504-105期</td><td class='tdright'>2016-05-04 22:46</td><td style='color:red'>3|5|6|0|6</td><tr class='bg'><td>20160504-104期</td><td class='tdright'>2016-05-04 22:41</td><td style='color:red'>2|1|1|0|4</td><tr><td>20160504-103期</td><td class='tdright'>2016-05-04 22:36</td><td style='color:red'>8|9|3|8|8</td><tr class='bg'><td>20160504-102期</td><td class='tdright'>2016-05-04 22:31</td><td style='color:red'>6|2|9|0|9</td><tr><td>20160504-101期</td><td class='tdright'>2016-05-04 22:26</td><td style='color:red'>1|9|9|4|2</td><tr class='bg'><td>20160504-100期</td><td class='tdright'>2016-05-04 22:21</td><td style='color:red'>6|2|0|8|9</td><tr><td>20160504-099期</td><td class='tdright'>2016-05-04 22:16</td><td style='color:red'>4|2|2|8|5</td><tr class='bg'><td>20160504-098期</td><td class='tdright'>2016-05-04 22:11</td><td style='color:red'>3|8|2|0|8</td><tr><td>20160504-097期</td><td class='tdright'>2016-05-04 22:06</td><td style='color:red'>9|4|6|8|1</td><tr class='bg'><td>20160504-096期</td><td class='tdright'>2016-05-04 22:01</td><td style='color:red'>8|3|7|9|2</td><tr><td>20160504-095期</td><td class='tdright'>2016-05-04 21:51</td><td style='color:red'>4|7|3|4|2</td><tr class='bg'><td>20160504-094期</td><td class='tdright'>2016-05-04 21:41</td><td style='color:red'>1|2|6|3|0</td><tr><td>20160504-093期</td><td class='tdright'>2016-05-04 21:31</td><td style='color:red'>5|2|5|8|5</td><tr class='bg'><td>20160504-092期</td><td class='tdright'>2016-05-04 21:21</td><td style='color:red'>8|1|1|7|7</td><tr><td>20160504-091期</td><td class='tdright'>2016-05-04 21:11</td><td style='color:red'>1|9|6|6|5</td><tr class='bg'><td>20160504-090期</td><td class='tdright'>2016-05-04 21:01</td><td style='color:red'>4|4|4|3|4</td><tr><td>20160504-089期</td><td class='tdright'>2016-05-04 20:51</td><td style='color:red'>2|1|2|4|2</td><tr class='bg'><td>20160504-088期</td><td class='tdright'>2016-05-04 20:41</td><td style='color:red'>3|2|8|0|2</td><tr><td>20160504-087期</td><td class='tdright'>2016-05-04 20:31</td><td style='color:red'>1|2|7|7|1</td><tr class='bg'><td>20160504-086期</td><td class='tdright'>2016-05-04 20:21</td><td style='color:red'>0|4|3|2|8</td><tr><td>20160504-085期</td><td class='tdright'>2016-05-04 20:11</td><td style='color:red'>3|4|1|1|7</td><tr class='bg'><td>20160504-084期</td><td class='tdright'>2016-05-04 20:01</td><td style='color:red'>5|3|9|9|0</td><tr><td>20160504-083期</td><td class='tdright'>2016-05-04 19:51</td><td style='color:red'>5|9|5|5|8</td><tr class='bg'><td>20160504-082期</td><td class='tdright'>2016-05-04 19:41</td><td style='color:red'>1|7|9|4|5</td><tr><td>20160504-081期</td><td class='tdright'>2016-05-04 19:31</td><td style='color:red'>8|8|6|3|0</td><tr class='bg'><td>20160504-080期</td><td class='tdright'>2016-05-04 19:21</td><td style='color:red'>4|5|0|0|6</td><tr><td>20160504-079期</td><td class='tdright'>2016-05-04 19:11</td><td style='color:red'>1|3|7|8|3</td><tr class='bg'><td>20160504-078期</td><td class='tdright'>2016-05-04 19:01</td><td style='color:red'>8|8|4|8|7</td><tr><td>20160504-077期</td><td class='tdright'>2016-05-04 18:51</td><td style='color:red'>4|9|1|2|6</td><tr class='bg'><td>20160504-076期</td><td class='tdright'>2016-05-04 18:41</td><td style='color:red'>6|3|8|5|0</td><tr><td>20160504-075期</td><td class='tdright'>2016-05-04 18:31</td><td style='color:red'>7|4|2|0|3</td><tr class='bg'><td>20160504-074期</td><td class='tdright'>2016-05-04 18:21</td><td style='color:red'>2|7|0|5|1</td><tr><td>20160504-073期</td><td class='tdright'>2016-05-04 18:11</td><td style='color:red'>4|1|5|0|9</td><tr class='bg'><td>20160504-072期</td><td class='tdright'>2016-05-04 18:01</td><td style='color:red'>5|3|1|2|0</td><tr><td>20160504-071期</td><td class='tdright'>2016-05-04 17:51</td><td style='color:red'>5|2|6|5|0</td><tr class='bg'><td>20160504-070期</td><td class='tdright'>2016-05-04 17:41</td><td style='color:red'>3|5|5|4|7</td><tr><td>20160504-069期</td><td class='tdright'>2016-05-04 17:31</td><td style='color:red'>1|0|2|8|7</td><tr class='bg'><td>20160504-068期</td><td class='tdright'>2016-05-04 17:21</td><td style='color:red'>2|7|2|6|5</td><tr><td>20160504-067期</td><td class='tdright'>2016-05-04 17:11</td><td style='color:red'>9|3|3|2|8</td><tr class='bg'><td>20160504-066期</td><td class='tdright'>2016-05-04 17:01</td><td style='color:red'>9|7|2|3|9</td><tr><td>20160504-065期</td><td class='tdright'>2016-05-04 16:51</td><td style='color:red'>0|7|1|6|6</td><tr class='bg'><td>20160504-064期</td><td class='tdright'>2016-05-04 16:41</td><td style='color:red'>2|6|2|0|1</td><tr><td>20160504-063期</td><td class='tdright'>2016-05-04 16:31</td><td style='color:red'>7|5|8|0|2</td><tr class='bg'><td>20160504-062期</td><td class='tdright'>2016-05-04 16:21</td><td style='color:red'>3|5|1|9|9</td><tr><td>20160504-061期</td><td class='tdright'>2016-05-04 16:11</td><td style='color:red'>8|7|1|1|3</td><tr class='bg'><td>20160504-060期</td><td class='tdright'>2016-05-04 16:01</td><td style='color:red'>9|2|4|5|9</td><tr><td>20160504-059期</td><td class='tdright'>2016-05-04 15:51</td><td style='color:red'>3|3|1|1|7</td><tr class='bg'><td>20160504-058期</td><td class='tdright'>2016-05-04 15:41</td><td style='color:red'>6|4|2|2|9</td><tr><td>20160504-057期</td><td class='tdright'>2016-05-04 15:31</td><td style='color:red'>9|5|9|5|3</td><tr class='bg'><td>20160504-056期</td><td class='tdright'>2016-05-04 15:21</td><td style='color:red'>2|4|4|0|9</td><tr><td>20160504-055期</td><td class='tdright'>2016-05-04 15:11</td><td style='color:red'>4|0|0|1|5</td><tr class='bg'><td>20160504-054期</td><td class='tdright'>2016-05-04 15:01</td><td style='color:red'>5|2|6|5|4</td><tr><td>20160504-053期</td><td class='tdright'>2016-05-04 14:51</td><td style='color:red'>5|9|6|4|7</td><tr class='bg'><td>20160504-052期</td><td class='tdright'>2016-05-04 14:41</td><td style='color:red'>4|3|8|5|7</td><tr><td>20160504-051期</td><td class='tdright'>2016-05-04 14:31</td><td style='color:red'>4|4|8|4|3</td><tr class='bg'><td>20160504-050期</td><td class='tdright'>2016-05-04 14:21</td><td style='color:red'>0|3|4|7|3</td><tr><td>20160504-049期</td><td class='tdright'>2016-05-04 14:11</td><td style='color:red'>7|0|1|6|6</td><tr class='bg'><td>20160504-048期</td><td class='tdright'>2016-05-04 14:01</td><td style='color:red'>5|4|0|8|8</td><tr><td>20160504-047期</td><td class='tdright'>2016-05-04 13:51</td><td style='color:red'>5|5|9|7|1</td><tr class='bg'><td>20160504-046期</td><td class='tdright'>2016-05-04 13:41</td><td style='color:red'>8|0|8|1|7</td><tr><td>20160504-045期</td><td class='tdright'>2016-05-04 13:31</td><td style='color:red'>1|6|1|9|3</td><tr class='bg'><td>20160504-044期</td><td class='tdright'>2016-05-04 13:21</td><td style='color:red'>2|8|9|0|0</td><tr><td>20160504-043期</td><td class='tdright'>2016-05-04 13:11</td><td style='color:red'>7|5|6|5|5</td><tr class='bg'><td>20160504-042期</td><td class='tdright'>2016-05-04 13:01</td><td style='color:red'>9|6|9|5|5</td><tr><td>20160504-041期</td><td class='tdright'>2016-05-04 12:51</td><td style='color:red'>0|3|8|4|0</td><tr class='bg'><td>20160504-040期</td><td class='tdright'>2016-05-04 12:41</td><td style='color:red'>8|4|9|6|4</td><tr><td>20160504-039期</td><td class='tdright'>2016-05-04 12:31</td><td style='color:red'>2|4|2|7|6</td><tr class='bg'><td>20160504-038期</td><td class='tdright'>2016-05-04 12:21</td><td style='color:red'>0|1|4|2|2</td><tr><td>20160504-037期</td><td class='tdright'>2016-05-04 12:11</td><td style='color:red'>5|5|0|4|9</td><tr class='bg'><td>20160504-036期</td><td class='tdright'>2016-05-04 12:01</td><td style='color:red'>2|6|0|3|6</td><tr><td>20160504-035期</td><td class='tdright'>2016-05-04 11:51</td><td style='color:red'>6|3|9|8|6</td><tr class='bg'><td>20160504-034期</td><td class='tdright'>2016-05-04 11:41</td><td style='color:red'>8|2|3|7|4</td><tr><td>20160504-033期</td><td class='tdright'>2016-05-04 11:31</td><td style='color:red'>8|4|7|0|7</td><tr class='bg'><td>20160504-032期</td><td class='tdright'>2016-05-04 11:21</td><td style='color:red'>4|7|4|3|1</td><tr><td>20160504-031期</td><td class='tdright'>2016-05-04 11:11</td><td style='color:red'>8|0|9|5|9</td><tr class='bg'><td>20160504-030期</td><td class='tdright'>2016-05-04 11:01</td><td style='color:red'>7|0|8|7|9</td><tr><td>20160504-029期</td><td class='tdright'>2016-05-04 10:51</td><td style='color:red'>4|0|4|8|1</td><tr class='bg'><td>20160504-028期</td><td class='tdright'>2016-05-04 10:41</td><td style='color:red'>0|2|5|3|4</td><tr><td>20160504-027期</td><td class='tdright'>2016-05-04 10:31</td><td style='color:red'>7|5|7|1|4</td><tr class='bg'><td>20160504-026期</td><td class='tdright'>2016-05-04 10:21</td><td style='color:red'>0|7|7|5|2</td><tr><td>20160504-025期</td><td class='tdright'>2016-05-04 10:11</td><td style='color:red'>0|9|1|1|0</td><tr class='bg'><td>20160504-024期</td><td class='tdright'>2016-05-04 10:01</td><td style='color:red'>3|7|3|9|4</td><tr><td>20160504-023期</td><td class='tdright'>2016-05-04 01:56</td><td style='color:red'>1|0|1|3|0</td><tr class='bg'><td>20160504-022期</td><td class='tdright'>2016-05-04 01:51</td><td style='color:red'>3|7|7|6|1</td><tr><td>20160504-021期</td><td class='tdright'>2016-05-04 01:46</td><td style='color:red'>2|9|0|5|9</td><tr class='bg'><td>20160504-020期</td><td class='tdright'>2016-05-04 01:41</td><td style='color:red'>7|6|3|0|4</td><tr><td>20160504-019期</td><td class='tdright'>2016-05-04 01:36</td><td style='color:red'>4|7|0|9|8</td><tr class='bg'><td>20160504-018期</td><td class='tdright'>2016-05-04 01:31</td><td style='color:red'>3|7|2|0|2</td><tr><td>20160504-017期</td><td class='tdright'>2016-05-04 01:26</td><td style='color:red'>0|8|8|4|5</td><tr class='bg'><td>20160504-016期</td><td class='tdright'>2016-05-04 01:21</td><td style='color:red'>6|0|5|8|3</td><tr><td>20160504-015期</td><td class='tdright'>2016-05-04 01:16</td><td style='color:red'>7|7|4|8|6</td><tr class='bg'><td>20160504-014期</td><td class='tdright'>2016-05-04 01:11</td><td style='color:red'>3|3|1|9|6</td><tr><td>20160504-013期</td><td class='tdright'>2016-05-04 01:06</td><td style='color:red'>1|7|4|5|1</td><tr class='bg'><td>20160504-012期</td><td class='tdright'>2016-05-04 01:01</td><td style='color:red'>7|2|2|0|6</td><tr><td>20160504-011期</td><td class='tdright'>2016-05-04 00:56</td><td style='color:red'>9|4|3|8|5</td><tr class='bg'><td>20160504-010期</td><td class='tdright'>2016-05-04 00:51</td><td style='color:red'>8|4|6|3|1</td><tr><td>20160504-009期</td><td class='tdright'>2016-05-04 00:46</td><td style='color:red'>6|7|4|0|0</td><tr class='bg'><td>20160504-008期</td><td class='tdright'>2016-05-04 00:41</td><td style='color:red'>1|9|5|5|8</td><tr><td>20160504-007期</td><td class='tdright'>2016-05-04 00:36</td><td style='color:red'>3|0|9|4|4</td><tr class='bg'><td>20160504-006期</td><td class='tdright'>2016-05-04 00:31</td><td style='color:red'>9|6|5|6|8</td><tr><td>20160504-005期</td><td class='tdright'>2016-05-04 00:26</td><td style='color:red'>4|8|1|5|4</td><tr class='bg'><td>20160504-004期</td><td class='tdright'>2016-05-04 00:21</td><td style='color:red'>1|9|0|7|4</td><tr><td>20160504-003期</td><td class='tdright'>2016-05-04 00:16</td><td style='color:red'>8|7|8|9|5</td><tr class='bg'><td>20160504-002期</td><td class='tdright'>2016-05-04 00:11</td><td style='color:red'>8|6|6|2|8</td><tr><td>20160504-001期</td><td class='tdright'>2016-05-04 00:06</td><td style='color:red'>7|4|3|3|8</td><tr class='bg'><td>20160503-120期</td><td class='tdright'>2016-05-04 00:01</td><td style='color:red'>3|6|5|5|1</td></table>";
			Document doc = Jsoup.parseBodyFragment(html);
			Elements elements = doc.getElementsByTag("tr");
			for (Element element : elements) {
				System.out.println(element.child(0).text());
				System.out.println(element.child(2).text());
			}*/
		Set<Lottery> set = new SinaLotteryDataProvider().provideDataWithLotteryTimeAsc("2016-05-07");
		System.err.println(set.size());
		for(Lottery lottery : set){
			System.err.println(lottery.getLotteryTime()+" >> "+lottery.getWinNumbers());
		}
	}


}
